//	Библиотека для удобства соединения нескольких Arduino по аппаратной шине I2C
//  Версия: 1.0.0
//  Последнюю версию библиотеки Вы можете скачать по ссылке: http://iarduino.ru/file/254.html
//  Подробное описание функции бибилиотеки доступно по ссылке: http://lesson.iarduino.ru/page/urok-26-3-soedinyaem-dve-arduino-po-shine-i2c/
//  Библиотека является собственностью интернет магазина iarduino.ru и может свободно использоваться и распространяться!
//  При публикации устройств или скетчей с использованием данной библиотеки, как целиком, так и её частей,
//  в том числе и в некоммерческих целях, просим Вас опубликовать ссылку: http://iarduino.ru
//  Автор библиотеки: Панькин Павел
//  Если у Вас возникли технические вопросы, напишите нам: shop@iarduino.ru

#ifndef iarduino_I2C_connect_h
#define iarduino_I2C_connect_h
#include <Wire.h>

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
								
class iarduino_I2C_connect{
	public:								uint8_t	readByte		(uint8_t, uint8_t);				//	чтение одного байта данных из устройства с указанием: (адрес устройства, адрес регистра)
	/**	пользовательские функции **/	uint8_t	writeByte		(uint8_t, uint8_t, uint8_t);	//	запись одного байта данных в  устройство с указанием: (адрес устройства, адрес регистра, байт для записи)
		template< typename T, size_t j>	void	begin			(T(&i)[j]){I2C_func_BEGIN(i,j);}//	инициализация в качестве slave, с указанием массива, данные кторого будут доступны для чтения/записи по шине I2C
		template< typename T, size_t j>	void	writeMask		(T(&i)[j]){I2C_func_MASK (i,j);}//	указание маскировочного массива, значение true элемента данного массива - разрешает менять значение соответствующего элемента в массиве I2C_array_REG по шине I2C
	private:							void	I2C_func_BEGIN	(uint8_t*, uint8_t);			//  внутренняя функция
	/**	внутренние функции **/			void	I2C_func_MASK	(bool*,    uint8_t);			//  внутренняя функция
};

class iarduino_I2C_connect_volatile_class{
	public:								uint8_t *I2C_array_REG	= 0;							//	указатель на массив, данные которого будут доступны для чтения/записи по шине I2C
	/**	указатели на массивы **/		uint8_t I2C_length_REG	= 0;							//	длина массива, данные которого будут доступны для чтения/записи по шине I2C
	/**	и значения их параметров **/	uint8_t I2C_index_REG	= 0;							//	индекс активного элемента массива (с которого начнётся чтение/запись)
										bool	*I2C_array_MASK	= 0;							//	указатель на маскировочный массив, значение true элемента данного массива - разрешает менять значение соответствующего элемента в массиве I2C_array_REG по шине I2C
										bool	I2C_length_MASK	= 0;							//	длина маскировочного массива
										bool	I2C_flag_MASK	= 0;							//	флаг, указывающий на то, что маскировочный массив был задан
};

#endif